home *** CD-ROM | disk | FTP | other *** search
- package regex;
-
- import java.util.BitSet;
- import java.util.Enumeration;
- import java.util.Hashtable;
-
- class RegExpDFA {
- private RegExpNFA nfa;
- private Hashtable dfa = new Hashtable();
- private DState initialDfaState;
- private int count = 0;
- private boolean hasLHead = false;
- private boolean hasLTail = false;
-
- private void markEmptyTransition(BitSet var1, int var2) {
- var1.set(var2);
-
- for(NList var3 = this.nfa.getNList(var2); var3 != null; var3 = var3.next()) {
- if (var3.chars().isEmpty() && !var1.get(var3.to())) {
- this.markEmptyTransition(var1, var3.to());
- }
- }
-
- }
-
- public DState nextState(DState var1, char var2) {
- for(DSList var3 = var1.next(); var3 != null; var3 = var3.next()) {
- if (var3.chars().has(var2)) {
- return var3.to();
- }
- }
-
- return null;
- }
-
- public DState nextState(DState var1, int var2) {
- for(DSList var3 = var1.next(); var3 != null; var3 = var3.next()) {
- if (var3.chars().type() == var2) {
- return var3.to();
- }
- }
-
- return null;
- }
-
- public DState getDState(int var1) {
- Integer var2 = new Integer(var1);
- return (DState)this.dfa.get(var2);
- }
-
- public RegExpDFA(RegExpNFA var1) {
- this.nfa = var1;
- this.convertNfaToDfa();
- }
-
- private DState fetchUnvisitedDState() {
- Enumeration var1 = this.dfa.elements();
-
- while(var1.hasMoreElements()) {
- DState var2 = (DState)var1.nextElement();
- if (!var2.visited()) {
- return var2;
- }
- }
-
- return null;
- }
-
- private DList computeReachableNState(DState var1) {
- boolean var8 = false;
- BitSet var7 = var1.nfaStateSet();
- DList var4 = null;
-
- for(int var2 = 0; var2 < this.nfa.count(); ++var2) {
- if (var7.get(var2)) {
- for(NList var3 = this.nfa.getNList(var2); var3 != null; var3 = var3.next()) {
- if (!var3.chars().isEmpty()) {
- var8 = false;
-
- for(DList var5 = var4; var5 != null; var5 = var5.next()) {
- if (var5.chars().equals(var3.chars())) {
- var5.to().set(var3.to());
- var8 = true;
- break;
- }
- }
-
- if (!var8) {
- DList var6 = new DList(var3.chars(), new BitSet(), (DList)null);
- var6.to().set(var3.to());
- var6.setNext(var4);
- var4 = var6;
- }
- }
- }
- }
- }
-
- return var4;
- }
-
- public DState initialState() {
- return this.initialDfaState;
- }
-
- private void collectEmptyTransition(BitSet var1) {
- for(int var2 = 0; var2 < this.nfa.count(); ++var2) {
- if (var1.get(var2)) {
- this.markEmptyTransition(var1, var2);
- }
- }
-
- }
-
- public RTree getTree() {
- return this.nfa.getTree();
- }
-
- public RegExpNFA getNfa() {
- return this.nfa;
- }
-
- private DState registerDState(BitSet var1) {
- Enumeration var2 = this.dfa.elements();
-
- while(var2.hasMoreElements()) {
- DState var3 = (DState)var2.nextElement();
- if (var3.nfaStateSet().equals(var1)) {
- return var3;
- }
- }
-
- DState var4 = new DState(var1, false, var1.get(this.nfa.exit()), (DSList)null);
- this.dfa.put(new Integer(this.count), var4);
- ++this.count;
- return var4;
- }
-
- public boolean hasLHead() {
- return this.hasLHead;
- }
-
- public boolean hasLTail() {
- return this.hasLTail;
- }
-
- public int count() {
- return this.count;
- }
-
- private void convertNfaToDfa() {
- BitSet var1 = new BitSet();
- var1.set(this.nfa.entry());
- this.collectEmptyTransition(var1);
- this.initialDfaState = this.registerDState(var1);
-
- DState var2;
- while((var2 = this.fetchUnvisitedDState()) != null) {
- var2.visit();
-
- for(DList var3 = this.computeReachableNState(var2); var3 != null; var3 = var3.next()) {
- this.collectEmptyTransition(var3.to());
- DSList var4 = new DSList(var3.chars(), (DState)null, (DSList)null);
- var4.setTo(this.registerDState(var3.to()));
- var4.setNext(var2.next());
- var2.setNext(var4);
- }
- }
-
- this.hasLHead = this.nfa.hasLHead();
- this.hasLTail = this.nfa.hasLTail();
- }
- }
-